Get crime data from ArcGIS API and remove (4) entries with missing geometry; write cleaned data to GeoJSON

# crime_dg <- st_read("https://utility.arcgis.com/usrsvcs/servers/3adad6320b7a421bb3826ec8871e2b66/rest/services/OpenData_PublicSafety/MapServer/2/query?outFields=*&where=1%3D1&f=geojson")
# crime_dg$Date <- as.Date(fread(".//data//crime_dg.csv")$Date, "%Y/%m/%d")
# crime_dg <- crime_dg[!st_is_empty(crime_dg),]
# st_write(crime_dg, ".//data//crime_dg.geojson")

Read in data

crime_dg <- st_read(".//data//crime_dg.geojson")
## Reading layer `crime_dg' from data source 
##   `C:\Users\darkg\Desktop\Dropbox\Homework Scans\2024F_SDS625\HW3\data\crime_dg.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 709898 features and 12 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -72.71865 ymin: 41.72215 xmax: -72.64829 ymax: 41.80744
## Geodetic CRS:  WGS 84
parcel_dg <- st_read(".//data//parcel_hartford.geojson")
## Reading layer `parcel_hartford' from data source 
##   `C:\Users\darkg\Desktop\Dropbox\Homework Scans\2024F_SDS625\HW3\data\parcel_hartford.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 19143 features and 47 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -72.7182 ymin: 41.72368 xmax: -72.64208 ymax: 41.80743
## Geodetic CRS:  WGS 84

Census tracts from Tigris for map baselayer

hartford_tracts <- st_filter(tracts(state = "CT"),
                             subset(county_subdivisions(state = "CT"), NAMELSAD == "Hartford town"),
                             .predicate = st_within) |>
   st_transform(crs = st_crs(crime_dg))

# hartford_tracts <- tracts(state = "CT", cb = TRUE, filter_by = st_bbox(st_transform(crime_dg, crs = "NAD83"))) |>
   # st_transform(crs = st_crs(crime_dg))

water <- st_intersection(st_transform(area_water("CT", "Hartford"), crs = st_crs(hartford_tracts)), hartford_tracts)
## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries

plot

ggplot(crime_dg) +
   geom_sf(data = hartford_tracts) +
   geom_sf(data = water, color = "blue", linewidth = 0.35) +
   geom_hex(aes(X, Y, fill = log10(..count..)), data = ~cbind(.x, st_coordinates(.x)), alpha = 0.75) +
   scale_fill_binned() +
   labs(x = "Latitude", y = "Longitude") +
   theme_bw()

g <- ggplot(dplyr::sample_n(crime_dg, 1e3)) +
   geom_sf(data = hartford_tracts) +
   geom_sf(data = dplyr::sample_n(parcel_dg, 1e3)) +
   geom_density_2d(aes(X,Y), data = ~cbind(.x, st_coordinates(.x))) +
   stat_sf_coordinates(size = 0.1, color = "red") +
   labs(x = "Latitude", y = "Longitude") +
   theme_bw()

p <- toWebGL(ggplotly(g))
p$x$data[[4]]$hoverinfo <- "none"
p